#!/usr/bin/env python
# coding: utf-8

# # AI 实现皮影戏，传承正在消失的艺术 【一键应用版】
# - 对**实现原理**和**代码实现**感兴趣的同学，请到此项目查看[【传送门】](https://aistudio.baidu.com/aistudio/projectdetail/764130)

# ##  一、项目背景
# 	  领略千年皮影戏魅力，传承正在消失的艺术, 皮影戏的神奇，在于小小皮影在指尖上飞舞，时而刀光剑影、时而策马扬鞭、时而缠绵悱恻，千军万马是他，单打独斗也是他。皮影戏可谓是闻名中外，它是把光影声色做到极致的一门古老艺术。
# <div style="text-align: center;">
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/e293aeb953e348d68b93f5fd0e53084093ed91dcf2c147ff80bc915988d43c91'/>
#   <p></p>
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/3c81f4c802094cf6873d55f47ff0e169f4e52c64959748cea2c7946ec6d3f872'/>
# <!-- ![](https://ai-studio-static-online.cdn.bcebos.com/e293aeb953e348d68b93f5fd0e53084093ed91dcf2c147ff80bc915988d43c91)
# ![](https://ai-studio-static-online.cdn.bcebos.com/3c81f4c802094cf6873d55f47ff0e169f4e52c64959748cea2c7946ec6d3f872)
# -->
# </div>
# 
# 	  先辈门通过手艺演绎着皮影戏，同样我们也可以通过AI方式来实现。为了实现皮影戏，可以通过PaddleHub提供的人体骨骼关键点检测库完成将人体姿态检测，同时映射到皮影身上，让皮影动起来。
# 

# ## 二、效果展示
# 
#    通过PaddleHub完成人体骨骼关键点检测，将人体骨骼关键点进行连接，就可以获取到人体的肢体骨骼，在骨骼肢体上覆盖皮影素材，就可以得到皮影人了。将视频中连续帧进行转换，就可以实现“皮影戏”的效果. 下面我们一起来看一下整体效果吧:
# - 对单张图片的转换，左边是原始图片，通过人体骨骼关键点检测后标注出了关键点位置，右边就是我们实现皮影素材叠加的效果：
# <div style="text-align: center;">
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/60db5496f7be4ef59d5a5403289dfa23ed8757065af84c758ed1eeaf782d9027'/>
#   
#   <!-- ![](https://ai-studio-static-online.cdn.bcebos.com/60db5496f7be4ef59d5a5403289dfa23ed8757065af84c758ed1eeaf782d9027) -->
# </div>
# 
# 
# - 在实现单张图片转换之后，我们就可以对视频中的每一帧进行处理，通过视频中的人物运动，让皮影动起来!  我b站上找了一个可爱的小姐姐进行转换（别只看小姐姐哦！），效果如下：
# 
# <div style="text-align: center;">
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/d2470f5cf2aa4e6ca25990f939558affce26fd1a1d2f441995db2d1c73263cf5'/>
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/c99994cf5fb3408fb51af3f48f95577a0cb8e8583edd48d480232edb44837dae'/>
#   <!-- ![](https://ai-studio-static-online.cdn.bcebos.com/c447d87b175844c194e006759bf6f217153ac8d123a443aa9a1c654496a44c4e) 
# ![](https://ai-studio-static-online.cdn.bcebos.com/c99994cf5fb3408fb51af3f48f95577a0cb8e8583edd48d480232edb44837dae)
# -->
# </div>
# 
# 
# 
# 
# 	NOTE： 如果您在本地运行该项目示例，需要首先安装PaddleHub。如果您在线运行，需要首先fork该项目示例。之后按照该示例操作即可。   
#     
# - 如果你觉得这个项目还挺有意思，欢迎大家 ***Fork / ❤喜欢 / 评论*** 三连，你的**支持**是这个项目更新的最大动力！希望后续还能给大家输出更有意思的项目！

# ## 三、具体使用
# **1.修改下面变量file_name='video.mp4'为自己需要输入视频文件路径名称 或 将自己上传的文件命名为 video.mp4;**
# 
# 
# **2. 在右上方菜单 点击【运行】-> 【全部运行】;**
# - ![](https://ai-studio-static-online.cdn.bcebos.com/c7948e67c7da4d219a4d8d7a8ecf54d4022fb5eb947543a3b0535330deba1943)
# 
# 
# **3. 运行完成后会在视频所在目录下输出_result.mp4文件, 下载即可查看效果;**
# - ![](https://ai-studio-static-online.cdn.bcebos.com/f536f334e546407b8c21b3c2f5e4a674f9e17d5fa2744153a4f62e9c5cdad4ed)
# 
# - PS: 运行时间由大家输入的视频画面大小和播放时长决定，请耐心等待

# In[ ]:





# In[9]:


# 输入的视频文件
file_name = 'video.mp4'


# In[ ]:





# In[13]:


get_ipython().system(' rm -rf work/mp4_img/')
get_ipython().system(' rm -rf work/mp4_img_analysis/')

get_ipython().system(' mkdir work/mp4_img')
get_ipython().system(' mkdir work/mp4_img_analysis')
get_ipython().system(' mkdir work/shadow_play_material')
# 解压素材
get_ipython().system('unzip -q -o /home/aistudio/data/data53265/shadow_play_material.zip -d /home/aistudio/work/shadow_play_material/')


# In[10]:


get_ipython().system(' hub install human_pose_estimation_resnet50_mpii==1.1.1')


# In[11]:


from work.shadow_play import *


# In[12]:


file_output_temp = file_name[:file_name.rindex('.')]+'_temp.mp4'
file_output_result = file_name[:file_name.rindex('.')]+'_result.mp4'


# In[14]:


body_img_path_map = {
    "right_hip" : "./work/shadow_play_material/right_hip.jpg",
    "right_knee" : "./work/shadow_play_material/right_knee.jpg",
    "left_hip" : "./work/shadow_play_material/left_hip.jpg",
    "left_knee" : "./work/shadow_play_material/left_knee.jpg",
    "left_elbow" : "./work/shadow_play_material/left_elbow.jpg",
    "left_wrist" : "./work/shadow_play_material/left_wrist.jpg",
    "right_elbow" : "./work/shadow_play_material/right_elbow.jpg",
    "right_wrist" : "./work/shadow_play_material/right_wrist.jpg",
    "head" : "./work/shadow_play_material/head.jpg",
    "body" : "./work/shadow_play_material/body.jpg"
}

mp4_img_path = 'work/mp4_img/'
mp4_img_analysis_path = 'work/mp4_img_analysis'


# In[16]:


# 将视频中每一帧保存成图片
fps = transform_video_to_image(file_name, mp4_img_path)
# 分析图片中的人体姿势， 并转换为皮影姿势，输出结果
analysis_pose(mp4_img_path, mp4_img_analysis_path, body_img_path_map)
# 合并图像到视频
combine_image_to_video(mp4_img_analysis_path, file_output_temp, fps)
# 添加音频
os.system('ffmpeg -i {} -i {} -c:v copy -c:a copy {} -y'.format(file_output_temp, file_name, file_output_result))
# 删除缓存
os.system('rm -f {}'.format(file_output_temp))

print('---------- SUCCESS !!! ---------')


# In[ ]:





# 1. - **OK, 最后我们得到动起来的皮影戏了!!!**
# 
# 大家可以将视频下载到本地进行查看
# 
# <div style="text-align: center;">
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/d2470f5cf2aa4e6ca25990f939558affce26fd1a1d2f441995db2d1c73263cf5'/>
#   
#   <!-- ![](https://ai-studio-static-online.cdn.bcebos.com/d2470f5cf2aa4e6ca25990f939558affce26fd1a1d2f441995db2d1c73263cf5) -->
# </div>
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 
# 
# <img width=100, src='https://ai-studio-static-online.cdn.bcebos.com/0c394edb101c40c8b3cf8af2411a10e989f6c96c2fac4cf4a046ddbb4093c8ab'/> 从此，又多了一个看舞蹈区小姐姐的理由！哦耶！
# <div style="text-align: center;">
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/24e72896e16c473caa24e9519c4e5bda53eb86c986e0439895374ef109886c9e'/>
#   <img src='https://ai-studio-static-online.cdn.bcebos.com/24363e82e0a8406e92d865ee951fc4f7c2e89c710fa7432bbec8568e29b0bbbd'/>
# </div>
# 
# 

# In[ ]:





# ## 四. 总结
# 
# - 本文在弘扬传统文化同时，能让读者学习AI知识，体会到 PaddleHub 的强大, 可谓一举两得！
# 
# - 后续版本会考虑让皮影的动作更贴合人体姿态，整体视觉效果上更好！！！
# 
# - 来AI Studio互粉吧，来互关呀~，~等你哦~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/331031
# 
# - 如果你觉得这个项目还挺有意思，欢迎大家 ***Fork / ❤喜欢 / 评论*** 三连，你的**支持**是这个项目更新的最大动力！希望后续还能给大家输出更有意思的项目！

# In[ ]:




